選型比努力重要,那些早知道就好的事之一:早知道有Google Sheets API,我當初就不會選擇用GAS環境的
doGet
刻一個假的HTTP response物件。
會想分享這則筆記,是因為個人在某個實作上,愚蠢地選擇了不適合的服務,儘管解決了需求,但繞了遠路、徒勞且浪費一堆時間。
今天要來聊與Google Sheets相關的幾種服務的差異,並補充一些個人主觀選型偏好。
Google Sheets相關的功能或服務[^1],不論是內建或支援,我個人的心智地圖目前如下:
首先是內建服務,它是Google Workspace這套商業應用服務生態系所提供的low-code自動化方案的API入口。從規格上來看,就是昨天(Day03)提到的,掛在globalThis
上的GAS環境特有的全域變數:
globalThis
├─ Google Workspace
│ ├─ SpreadsheetApp / DocumentApp / SlidesApp
│ ├─ FormApp / GmailApp / CalendarApp
│ └─ DriveApp
內建服務關於試算表操作的文法語順比較貼近VBA[^2],雖然功能沒有Google Sheets API強,但小型專案已經足夠使用,且不用跑繁複的GCP權限開通與IAM設定。
例如在VBA上的這句:
Range("A1").Value = Format(yesterday, "mm/dd")
在GAS上是相似的語順:
sheet.getRange("A1").setValue(formattedDate);
除此之外,如果需要客製化選單,讓使用者自行觸發函式,除了用HTML,那就只有內建服務的SpreadsheetApp可以產製原生GUI。
不同於內建服務,Google Sheets API就不屬於GAS環境,而是Google提供的另一套完整的REST API服務,語法風格就完全沒有VBA的色彩。
Google Sheets API現在被整合進GCP方案,不同於其他小型API,必須先跑完繁複的IAM流程後,才能開始使用。
優點是免費配額比內建服務更多,對於進階批次處理的效能更好,在複雜邏輯時的語法比GAS環境內建服務更簡潔。
對以上兩者的定位有初步認識後,就比較好理解進階服務。進階服務其實就是GAS環境對於Google Sheets API的封裝,因此進階服務的版本有時候會落後於Google Sheets API的版本。
進階服務需要在GAS環境的雲端IDE額外開啟,才會被掛上globalThis
。換言之,沒有開啟前,globalThis
不存在進階服務,也就無法使用。雖然可以自行更改進階服務的別名,但實務上為了測試環境與正式環境能複用,通常不會更改,除非會同時用到舊版與新版API才有需要更改以做區分。
其實每個GAS專案都有綁一個開發者無法自行做細部設定的GCP專案,當開發者在雲端編輯器開啟進階服務時,GAS環境就會自動做好預設的權限配置。[^3]
接著來聊聊我的主觀偏好。
僅就我個人的前端與VBA經驗來評估,我覺得如果是VBA專案要上雲,那用內建服務會最有效率,不用跑IAM流程,直接用GenAI轉換或Google官方的轉換器。又或是當下的狀態比較熟悉VBA的語感,不會做太複雜的操作,那就用內建服務就好,等遇到瓶頸再轉進階服務。
如果熟悉JavaScript或Python(玩資料庫的大大因為各種業務現場的無奈轉回用Google Sheets?),那就直接開進階服務,功能更完整。可是它有一個缺點,就是會同時吃GAS專案和GCP專案兩邊的配額。
如果需要從外部環境與GAS環境互動時,就必須去開通Google Sheets API。當然,理想上如果有足夠的時間去做前期權限設定,直接用API更好。不過,我依然覺得GAS專案通常是用來處理小型自動化,如果要走到這步,建議也將GAS環境以外的解決方案一併評估。
關於GUI,可以自行選型要用HTML還是內建服務的原生GUI,這部分就不是Google Sheets API可以處理的。我目前實務上對於GUI的實作分成兩種:SpreadsheetApp
的客製化選單,使用者體驗一致;或就用瀏覽器環境,prebuild時依賴csv檔或Google Sheets API。[^4]
[^1]: https://developers.google.com/apps-script/guides/services
[^2]: 當然,只是試算表相關物件看似相同,有很多細節兩者都不同甚至相反。後面幾天如果有回顧到VBA專案的話,可能再來聊聊。
[^3]: 之後也可以自行綁另一個完全自定義的GCP專案。
[^4]: 還有一個方式是,在GAS專案環境部署HTML,我沒有實作過,可以參考Winnieさん於2024年鐵人賽圖文並茂的範例。